// 语言第四章 函数
// 当函数名大写， 表明函数是构造函数
// 函数就可以构造一个类
// js 早期没有class 关键字
// 函数是一等对象，可以用来构造对象
// js 其实没有类
// 但并影响它做java 的传统面向对象编程
function Cat(name){
    // 给一组对象添加属性
    this.name = name;
    // 内存开销 复杂的多 入栈 分配堆内存
    // this.makeSound = function () {
    //     console.log("喵喵喵");
    // }
}
// 是一个构造对象的函数
// 函数也是对象
// js 函数对象有 prototype 属性
// 公有的方法放到 prototype 对象中
// 用prototype 声明的方法 内存分配可以在调用时分配 节省内存
Cat.prototype.makeSound = function () {
         console.log("喵喵喵");
     }
Cat.prototype.eat = function () {
    console.log("吃鱼");
}
Cat.sayHi = function() {
    console.log('你好啊');
}
// 同一组对象 共同的类方法、属性模板
var xm = new Cat('小黑');
xm.makeSound();
console.log(xm.name);
xm.eat();
console.log(xm.sayHi);
// var xh = new Cat('小花');
// console.log(xm==xh);  //false
// // 判断两个对象是兄弟
// // 通过实例找到构造函数
// console.log(xm.constructor);  //[Function: Cat]
// // 判断对象是某类的实例
// // typeof 判断某种类型 typeof []  Object
// console.log(xm instanceof Cat);
// //Object 即是对象又是函数
// let a = {};
// let obj = new Object();
// console.log(obj instanceof Object);  //true
// console.log(typeof Object);  //function
console.log(Cat.prototype);